package com.lobov.containers;

import java.io.Serializable;

import com.lobov.entities.Matrix;
import com.lobov.entities.Snip;
import com.lobov.entities.Vector;
import com.lobov.operations.Multiplication;

/**
 * Контейнер для хранения перемножаемых матриц или матрицы и вектора (hasvector
 * - присутствует ли в умножении вектор иначе только матрицы)
 */
public class MultiPair implements Serializable {

	private static final long serialVersionUID = 1L;

	/**
	 * создать контейнер для матрицы и вектора
	 * 
	 * @param m1
	 *            заданная матрица
	 * @param v
	 *            заданный вектор
	 */
	public MultiPair(Matrix m1, Vector v) {
		super();
		this.m1 = m1;
		this.v = v;
		this.hasVector = true;
		this.hasSnip = false;
	}

	/**
	 * создать контейнер для двух матриц
	 * 
	 * @param m1
	 *            первая заданная матрица
	 * @param m2
	 *            вторая заданная матрица
	 */
	public MultiPair(Matrix m1, Matrix m2) {
		super();
		this.m1 = m1;
		this.m2 = m2;
		this.hasVector = false;
		this.hasSnip = false;
	}

	/**
	 * 
	 * @param m1
	 *            заданная матрица
	 * @param snip
	 *            оскут
	 */
	public MultiPair(Matrix m1, Snip snip) {
		super();
		this.m1 = m1;
		this.setSnip(snip);
		this.hasVector = false;
		this.hasSnip = true;
	}

	private boolean hasSnip;
	private boolean hasVector;
	private Matrix m1;
	private Matrix m2;
	private Snip snip;
	private Vector v;

	public boolean isHasVector() {
		return hasVector;
	}

	public void setHasVector(boolean hasVector) {
		this.hasVector = hasVector;
	}

	public Matrix getM1() {
		return m1;
	}

	public void setM1(Matrix m1) {
		this.m1 = m1;
	}

	public Matrix getM2() {
		return m2;
	}

	public void setM2(Matrix m2) {
		this.m2 = m2;
	}

	public Vector getV() {
		return v;
	}

	public void setV(Vector v) {
		this.v = v;
	}

	public boolean isHasSnip() {
		return hasSnip;
	}

	public void setHasSnip(boolean hasSnip) {
		this.hasSnip = hasSnip;
	}

	public Snip getSnip() {
		return snip;
	}

	public void setSnip(Snip snip) {
		this.snip = snip;
	}

	public Object compute() throws Exception {
		if(!hasSnip && !hasVector){
			return Multiplication.newInstance().matrixOnMatrix(m1, m2, false);
		} else if(hasSnip && !hasVector){
			return Multiplication.newInstance().snipOnMatrix(snip, m1, false);
		}
		return null;
	}
}
